Skip to content

perf(aggregate): consecutive-keys (last-group) cache for GROUP BY on clustered data - #23986

Draft
zhuqi-lucas wants to merge 2 commits into
apache:mainfrom
zhuqi-lucas:perf/agg-last-group-cache
Draft

perf(aggregate): consecutive-keys (last-group) cache for GROUP BY on clustered data#23986
zhuqi-lucas wants to merge 2 commits into
apache:mainfrom
zhuqi-lucas:perf/agg-last-group-cache

Conversation

@zhuqi-lucas

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

GroupValues::intern pays the full hash + hash-table-probe cost for every input row, even when a row's group key equals the previous row's. For high-cardinality keys the table is far too large to stay cache-resident, so each probe is typically an L3/DRAM round trip.

Real-world data very often arrives with runs of identical keys (time-ordered logs, clustered writes). Measured on ClickBench hits.parquet in file order — which is what the Partial aggregation phase sees, since it runs before repartitioning:

column avg run length consecutive-keys hit rate
CounterID 58,693 ~100%
OS 15.6 93.6%
SearchPhrase 11.7 91.5%
RegionID 11.0 90.9%
UserID 10.1 90.1%
URL 1.4 30.2%

Remembering the previous row's key and group index lets a run reuse the answer: a hit replaces a random memory access with one or two well-predicted compares against L1-resident state; a miss costs a single compare. Break-even hit rate is under 1%. This is the same optimization ClickHouse ships as its consecutive keys optimization (LastElementCache in ColumnsHashing, refined in ClickHouse#57872).

The win scales with hit rate × probe cost: Q33's URL table is the largest string hash table, so even a 30% hit rate pays the most per skipped probe, while Q27's ~6K-entry CounterID table is L1/L2-resident and gains little at ~100% hit rate.

What changes are included in this PR?

Four implementations, one per intern path:

  • GroupValuesPrimitive (single primitive key): cache (last_key, last_group) fields; the guard compares the canonicalized value itself, so a hit skips the hash as well as the probe. Invalidated in emit / clear_shrink since both reassign group indices.

  • ArrowBytesMap::insert_if_new_inner (single Utf8 / LargeUtf8 / Binary key via GroupValuesBytes; also used by distinct-aggregate accumulators, which benefit for free): compare the current row's bytes against the previous input row's — adjacent rows in the same values buffer, so the comparison is cache-hot. Per-call state, no invalidation concerns.

  • ArrowBytesViewMap::insert_if_new_inner (single Utf8View / BinaryView key via GroupValuesBytesView): for inline views (len ≤ 12) the u128 view comparison is a complete equality check; longer values get length + 4-byte-prefix guards from the views before touching bytes.

  • GroupValuesColumn (multi-column keys, both the vectorized and streaming interns): a batch-level adjacent-equality mask (not_distinct per column, AND-ed — null == null counts as equal, matching GROUP BY semantics), guarded by a two-tier gate: a sequential scan over the already-computed hashes counts adjacent hash matches, and only run-heavy batches (≥ ~6%) build the precise mask. Shuffled inputs — e.g. the Final phase after hash repartitioning — fail the gate and pay nothing beyond that one scan. Correctness never rests on the hashes; they only decide whether the mask is worth building. Nested-type columns (handled by RowsGroupColumn) make the helper return None and fall back to the normal path.

    Integration is deliberately non-invasive to the vectorized machinery: masked rows are skipped in collect_vectorized_process_context (they enter none of the append / equal-to / remaining lists), and a final ascending fill pass assigns each one its predecessor's group index.

Intervening nulls do not invalidate any of the caches (a value's group never changes within an accumulation), and the make-payload-once / observe-per-row-in-order contract of the byte maps is preserved.

Are these changes tested?

  • consecutive_keys_runs_and_emit_invalidation (primitive): runs with interleaved nulls, plus the emit(First(n)) index-shift trap — a stale cache would assign shifted group ids.
  • string_map_consecutive_keys_runs / view_map_consecutive_keys_runs: payload-assignment equality between run and scattered occurrences, interleaved nulls, inline and non-inline string lengths, make_payload_fn called exactly once per distinct.
  • test_intern_consecutive_keys_multi_column: identical group assignments on both intern paths, including the "one column runs while the other breaks the run" case and null == null runs; test_intern_consecutive_keys_no_runs exercises the gate fallback.
  • Probe-verified (temporary eprintln) that the fast path fires for exactly the designed rows on both multi-column paths and that the gate rejects the no-runs batch.
  • Full aggregates:: suite (158), datafusion-physical-expr-common suite (77), and workspace clippy with -D warnings all pass.

Are there any user-facing changes?

No API changes. Local ClickBench numbers (hits.parquet, 5–8 iterations, release-nonlto, macOS ARM, both binaries built from this branch's base commit) — CI benchmarks to confirm:

query GROUP BY delta
Q33 URL −18.0%
Q18 UserID, m, SearchPhrase −10.8%
Q15 UserID −10.7%
Q32 WatchID, ClientIP −10.2%
Q12 SearchPhrase −8.2%
Q7 AdvEngineID −6.2%
Q17 UserID, SearchPhrase −5.4%
Q27 CounterID −4.8%
Q16 UserID, SearchPhrase −3.0%
Q13 (COUNT DISTINCT rewrite, untouched path) noise ±3%

No regressions observed; queries whose plans don't touch these paths are unchanged.

…n GROUP BY

Real-world data frequently arrives with runs of identical group keys
(time-ordered logs, clustered writes). Today `GroupValues::intern` pays
the full hash + hash-table-probe cost for every row, even when a row's
key equals the previous row's — and for high-cardinality keys the table
is far too large to stay cache-resident, so each probe is typically an
L3/DRAM round trip.

Remember the previous row's key and its group/payload; when the current
row matches, reuse the answer and skip the probe (and for primitives,
the hash as well). A hit replaces a random memory access with one or two
well-predicted compares against L1-resident state; a miss costs a single
compare (<1ns). Break-even hit rate is under 1%. This is the same
optimization ClickHouse ships as its "consecutive keys optimization"
(`LastElementCache` in ColumnsHashing, refined in ClickHouse#57872).

Measured run lengths on ClickBench hits.parquet (file order, which is
what the Partial aggregation phase sees): UserID avg run 10.1 (90.1%
hit rate), SearchPhrase 11.7 (91.5%), RegionID 11.0 (90.9%), URL 1.4
(30.2%).

Three implementations, one per single-column path:

- `GroupValuesPrimitive` (primitive keys): cache `(last_key, last_group)`
  fields; the guard compares the canonicalized value itself, so a hit
  skips the hash too. Invalidated in `emit` / `clear_shrink`, since both
  reassign group indices.
- `ArrowBytesMap::insert_if_new_inner` (Utf8 / LargeUtf8 / Binary via
  `GroupValuesBytes`, also used by distinct-aggregate accumulators):
  compare the current row's bytes against the previous input row's —
  adjacent rows in the same values buffer, so the comparison is
  cache-hot. Per-call state, no invalidation concerns.
- `ArrowBytesViewMap::insert_if_new_inner` (Utf8View / BinaryView via
  `GroupValuesBytesView`): for inline views (len <= 12) the u128 view
  comparison is a complete equality check; longer values get length +
  4-byte-prefix guards from the views before touching bytes.

Intervening nulls do not invalidate the cached mapping (a value's
group/payload never changes within an accumulation), and the
make-payload-once / observe-per-row-in-order contract of the maps is
preserved by the fast path.

ClickBench (hits.parquet, 5 iterations, release-nonlto, both binaries
built from this commit's base):

  Q33 (URL)          3621ms -> 2969ms  (-18.0%)
  Q15 (UserID)        304ms ->  271ms  (-10.7%)
  Q12 (SearchPhrase)  389ms ->  357ms  ( -8.2%)
  Q7  (AdvEngineID)    20ms ->   18ms  ( -6.2%)
  Q27 (CounterID)     739ms ->  704ms  ( -4.8%)

The win scales with (hit rate x probe cost): Q33's URL table is the
largest string hash table, so even a 30% hit rate pays the most per
skipped probe; Q27's ~6K-entry table is L1/L2-resident, so gains are
small even at ~100% hit rate.

Tests: consecutive-run + interleaved-null payload-assignment tests for
both maps, and a primitive test covering the emit(First(n)) cache
invalidation (a stale cache would assign shifted group ids).
…n GROUP BY

Extends the last-group cache to `GroupValuesColumn` (both the vectorized
and the streaming/scalarized intern), covering multi-column group keys
such as ClickBench's `GROUP BY "UserID", "SearchPhrase"`.

Multi-column runs need every column to match its predecessor, so instead
of a per-row cached slot the batch computes an adjacent-equality mask up
front, guarded by a two-tier gate:

- A single sequential scan over the (already computed) hashes counts
  adjacent hash matches. Hash equality is a necessary condition for row
  equality, so a shuffled batch — e.g. the Final phase after hash
  repartitioning, where runs cannot survive — fails the gate and pays
  nothing beyond this one scan. Correctness never rests on the hashes:
  they only decide whether the mask is worth building.
- Run-heavy batches build the precise mask: one vectorized
  `not_distinct` pass per column, AND-ed. `not_distinct` treats
  `null == null` as equal, matching GROUP BY semantics, and never
  returns nulls. Column types it does not support (e.g. nested types
  handled by `RowsGroupColumn`) make the helper return `None`, falling
  back to the normal path.

Integration is deliberately non-invasive to the vectorized machinery:
masked rows are skipped in `collect_vectorized_process_context` (they
enter none of the append / equal-to / remaining lists), and a final
ascending fill pass assigns each one its predecessor's group index —
forward propagation resolves multi-row runs from the run head, which
took the normal path. The streaming path checks the mask at the top of
its row loop and reuses the previous row's group index directly; sorted
input has perfect runs, so it benefits the most.

ClickBench multi-column queries (hits.parquet, 5-8 iterations,
release-nonlto, same-commit baseline):

  Q18 (UserID, m, SearchPhrase)  3714ms -> 3312ms  (-10.8%)
  Q32 (WatchID, ClientIP)        3478ms -> 3122ms  (-10.2%, 8 iters)
  Q17 (UserID, SearchPhrase)      740ms ->  700ms  ( -5.4%)
  Q16 (UserID, SearchPhrase)      819ms ->  795ms  ( -3.0%)

Tests: a multi-column runs test asserting identical group assignments on
both intern paths — including the "one column runs, the other breaks the
run" case and null==null runs — plus a no-runs batch exercising the gate
fallback. Probe-verified (temporary eprintln) that the fast path fires
for exactly the designed rows on both paths and that the gate rejects
the no-runs batch.
@zhuqi-lucas

Copy link
Copy Markdown
Contributor Author

run benchmark clickbench_partitioned

@github-actions github-actions Bot added physical-expr Changes to the physical-expr crates physical-plan Changes to the physical-plan crate labels Jul 30, 2026
@adriangbot

Copy link
Copy Markdown

🤖 Benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c5125309650-1296-8cz27 6.12.85+ #1 SMP Mon May 11 08:17:35 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing perf/agg-last-group-cache (4c05353) to 68d5874 (merge-base) diff using: clickbench_partitioned
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

Comparing HEAD and perf_agg-last-group-cache
--------------------
Benchmark clickbench_partitioned.json
--------------------
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Query     ┃                                   HEAD ┃             perf_agg-last-group-cache ┃        Change ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ QQuery 0  │           1.40 / 4.31 ±5.63 / 15.57 ms │          1.23 / 3.92 ±5.30 / 14.52 ms │ +1.10x faster │
│ QQuery 1  │         13.11 / 13.54 ±0.26 / 13.85 ms │        13.09 / 13.23 ±0.09 / 13.33 ms │     no change │
│ QQuery 2  │         36.80 / 37.22 ±0.36 / 37.67 ms │        36.02 / 36.35 ±0.23 / 36.69 ms │     no change │
│ QQuery 3  │         32.36 / 33.13 ±1.17 / 35.45 ms │        30.45 / 30.97 ±0.27 / 31.19 ms │ +1.07x faster │
│ QQuery 4  │     222.57 / 241.30 ±16.57 / 266.39 ms │     202.52 / 206.10 ±2.05 / 208.38 ms │ +1.17x faster │
│ QQuery 5  │      270.38 / 279.10 ±7.08 / 287.77 ms │     254.68 / 259.40 ±3.88 / 265.27 ms │ +1.08x faster │
│ QQuery 6  │            1.27 / 1.44 ±0.24 / 1.91 ms │           1.30 / 1.49 ±0.25 / 1.97 ms │     no change │
│ QQuery 7  │         13.74 / 13.89 ±0.10 / 14.02 ms │        14.38 / 14.56 ±0.17 / 14.83 ms │     no change │
│ QQuery 8  │      320.65 / 325.92 ±3.04 / 329.32 ms │    296.61 / 347.65 ±28.98 / 376.56 ms │  1.07x slower │
│ QQuery 9  │      451.09 / 461.20 ±7.69 / 471.89 ms │    515.44 / 539.78 ±14.86 / 561.92 ms │  1.17x slower │
│ QQuery 10 │         68.97 / 69.75 ±0.88 / 71.46 ms │        74.59 / 75.54 ±0.83 / 76.98 ms │  1.08x slower │
│ QQuery 11 │         80.01 / 81.83 ±1.17 / 83.65 ms │       86.76 / 90.62 ±6.35 / 103.25 ms │  1.11x slower │
│ QQuery 12 │      262.89 / 265.95 ±3.56 / 272.76 ms │     304.81 / 311.22 ±4.42 / 317.43 ms │  1.17x slower │
│ QQuery 13 │     368.28 / 393.94 ±25.52 / 432.13 ms │    365.68 / 399.69 ±24.79 / 431.06 ms │     no change │
│ QQuery 14 │     284.79 / 300.85 ±11.88 / 317.52 ms │     283.62 / 292.85 ±7.16 / 304.80 ms │     no change │
│ QQuery 15 │      269.99 / 272.94 ±3.38 / 278.63 ms │     249.38 / 254.88 ±4.22 / 260.82 ms │ +1.07x faster │
│ QQuery 16 │      607.04 / 615.04 ±6.76 / 627.51 ms │    627.35 / 640.04 ±13.58 / 660.58 ms │     no change │
│ QQuery 17 │      613.73 / 619.37 ±4.87 / 625.40 ms │    641.47 / 674.43 ±30.37 / 724.37 ms │  1.09x slower │
│ QQuery 18 │  1240.87 / 1256.85 ±11.58 / 1269.33 ms │ 1302.74 / 1315.19 ±10.71 / 1326.89 ms │     no change │
│ QQuery 19 │         27.88 / 30.68 ±4.77 / 40.21 ms │        28.17 / 29.36 ±2.01 / 33.37 ms │     no change │
│ QQuery 20 │     519.50 / 546.28 ±16.31 / 563.84 ms │     512.67 / 518.67 ±7.39 / 532.88 ms │ +1.05x faster │
│ QQuery 21 │      506.88 / 514.56 ±6.11 / 525.34 ms │     524.10 / 532.43 ±7.30 / 544.25 ms │     no change │
│ QQuery 22 │     980.86 / 991.22 ±6.78 / 1001.62 ms │    985.22 / 996.87 ±8.50 / 1011.66 ms │     no change │
│ QQuery 23 │ 3003.94 / 3153.04 ±130.89 / 3348.12 ms │ 3041.96 / 3111.37 ±63.06 / 3229.98 ms │     no change │
│ QQuery 24 │         41.91 / 43.73 ±2.41 / 48.39 ms │       41.44 / 50.40 ±11.72 / 72.51 ms │  1.15x slower │
│ QQuery 25 │      114.00 / 118.69 ±4.84 / 125.57 ms │     111.18 / 113.10 ±2.71 / 118.40 ms │     no change │
│ QQuery 26 │         42.03 / 43.13 ±0.90 / 44.67 ms │        42.10 / 44.92 ±3.48 / 51.67 ms │     no change │
│ QQuery 27 │     514.02 / 527.19 ±12.13 / 543.98 ms │     504.79 / 511.09 ±5.42 / 519.52 ms │     no change │
│ QQuery 28 │  2866.91 / 2926.34 ±48.08 / 3006.56 ms │ 2865.54 / 2961.65 ±76.33 / 3065.19 ms │     no change │
│ QQuery 29 │         42.65 / 44.27 ±2.73 / 49.70 ms │        41.16 / 41.43 ±0.21 / 41.72 ms │ +1.07x faster │
│ QQuery 30 │     301.47 / 328.46 ±21.19 / 350.74 ms │     299.17 / 316.21 ±8.85 / 323.39 ms │     no change │
│ QQuery 31 │      281.27 / 291.52 ±6.21 / 300.12 ms │     288.03 / 295.13 ±5.65 / 303.78 ms │     no change │
│ QQuery 32 │     937.91 / 962.98 ±15.14 / 981.98 ms │   945.12 / 985.11 ±46.93 / 1068.85 ms │     no change │
│ QQuery 33 │  1438.11 / 1469.50 ±18.88 / 1487.05 ms │ 1415.29 / 1498.59 ±71.02 / 1629.91 ms │     no change │
│ QQuery 34 │  1490.92 / 1556.23 ±79.91 / 1711.66 ms │ 1464.25 / 1508.99 ±62.12 / 1626.41 ms │     no change │
│ QQuery 35 │      276.88 / 279.98 ±2.35 / 283.04 ms │    258.76 / 307.78 ±73.09 / 449.32 ms │  1.10x slower │
│ QQuery 36 │         66.91 / 70.38 ±2.16 / 73.47 ms │      67.15 / 76.37 ±12.57 / 100.90 ms │  1.09x slower │
│ QQuery 37 │         35.58 / 38.97 ±5.31 / 49.40 ms │        35.22 / 35.73 ±0.44 / 36.49 ms │ +1.09x faster │
│ QQuery 38 │         41.27 / 44.47 ±3.49 / 49.87 ms │        41.01 / 44.36 ±2.66 / 47.47 ms │     no change │
│ QQuery 39 │      140.85 / 151.08 ±8.49 / 164.64 ms │     145.69 / 156.09 ±9.32 / 168.02 ms │     no change │
│ QQuery 40 │         14.00 / 16.34 ±3.18 / 22.62 ms │        14.16 / 14.52 ±0.31 / 14.99 ms │ +1.13x faster │
│ QQuery 41 │         13.48 / 14.11 ±0.38 / 14.61 ms │        13.60 / 14.71 ±2.09 / 18.88 ms │     no change │
│ QQuery 42 │         12.55 / 13.98 ±2.38 / 18.73 ms │        14.51 / 14.75 ±0.16 / 14.95 ms │  1.06x slower │
└───────────┴────────────────────────────────────────┴───────────────────────────────────────┴───────────────┘
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Benchmark Summary                        ┃            ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━┩
│ Total Time (HEAD)                        │ 19464.68ms │
│ Total Time (perf_agg-last-group-cache)   │ 19687.52ms │
│ Average Time (HEAD)                      │   452.67ms │
│ Average Time (perf_agg-last-group-cache) │   457.85ms │
│ Queries Faster                           │          9 │
│ Queries Slower                           │         10 │
│ Queries with No Change                   │         24 │
│ Queries with Failure                     │          0 │
└──────────────────────────────────────────┴────────────┘

Resource Usage

clickbench_partitioned — base (merge-base)

Metric Value
Wall time 100.0s
Peak memory 11.4 GiB
Avg memory 4.4 GiB
CPU user 1000.4s
CPU sys 69.0s
Peak spill 0 B

clickbench_partitioned — branch

Metric Value
Wall time 100.0s
Peak memory 11.5 GiB
Avg memory 4.7 GiB
CPU user 1008.1s
CPU sys 71.7s
Peak spill 0 B

File an issue against this benchmark runner

@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.58491% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 80.76%. Comparing base (68d5874) to head (4c05353).
⚠️ Report is 8 commits behind head on main.

Files with missing lines Patch % Lines
...gregates/group_values/single_group_by/primitive.rs 90.62% 0 Missing and 3 partials ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main   #23986    +/-   ##
========================================
  Coverage   80.75%   80.76%            
========================================
  Files        1096     1096            
  Lines      373282   373798   +516     
  Branches   373282   373798   +516     
========================================
+ Hits       301440   301885   +445     
- Misses      53869    53906    +37     
- Partials    17973    18007    +34     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

physical-expr Changes to the physical-expr crates physical-plan Changes to the physical-plan crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants